package com.hw.ui;
import java.text.*;
import java.io.*;
import com.hw.service.*;
import java.math.*;
import com.hw.dao.*;
import java.util.*;
import java.math.*;

/**
 * <p>
 * Title: 银行管理系统主界面
 * </p>
 * <p>
 * Description: 系统操作的主界面，通过该界面进行各项功能的操作
 * </p>
 * <p>
 * Copyright: Copyright (c) 2010-7-27
 * </p>
 * <p>
 * Filename: MainMenu.java
 * </p>
 * 
 * @author 李耀华
 * @version 1.0
 */
public class MainMenu {
	/**
	 *<br>
	 * 方法说明：菜单方法，实现界面的菜单 <br>
	 * 输入参数： <br>
	 * 返回类型：
	 */
	public void mainmenu() {
		// 调用service中的类并且实例化一个对象
		OperateAccount oa = new OperateAccount();
		// 实例化一个线程
		Thread th = new Thread();
		// 实现用户的界面
		System.out.println("--------------------------------------");
		System.out.println("         银行储蓄柜台综合业务平台     ");
		System.out.println("--------------------------------------");
		System.out.println("                1: 开户               ");
		System.out.println("                2: 存款               ");
		System.out.println("                3: 取款               ");
		System.out.println("                4: 查询               ");
		System.out.println("                5: 冻结               ");
		System.out.println("                6: 解冻               ");
		System.out.println("                7: 挂失               ");
		System.out.println("                8: 解挂               ");
		System.out.println("                9: 转账               ");
		System.out.println("                10:注销               ");
		System.out.println("                0: 退出               ");
		System.out.println("--------------------------------------");
		// 实例化一个控制台，以便输入信息
		System.out.println("---------请选择对应序号进行操作-------");
		Console console;
		int choice = 0;
		for (int n = 1; n > 0; n++) {
			// 输入校验: 输入必须是数字
			System.out.print("请选择对应序号:");
			console = System.console();
			String css = console.readLine();
			char[] ch = css.toCharArray();
			String s = null;
			boolean valid = true;

			for (int i = 0; i < ch.length; i++) {
				if (!Character.isDigit(ch[i])) {
					valid = false;
					break;
				}
			}
			if (valid) {
				s = new String(ch);
				choice = Integer.parseInt(s);
				break;
			} else {
				System.out.println("------必须为数字!请重新输入!----");
			}
		}
		// 根据值不同调用不同的方法
		switch (choice) {
		// 退出系统
		case 0:
			oa.Exit();
			break;
		// 进行开户操作
		case 1:
			System.out.println("---------------开户业务---------------");
			oa.createAccount();
			try {
				th.sleep(5000);
				mainmenu();
			} catch (Exception e) {
			}
			break;
		// 进行存款操作
		case 2:
			System.out.println("---------------存款业务---------------");
			oa.inputMoney();
			try {
				th.sleep(5000);
				mainmenu();
			} catch (Exception e) {
			}
			break;
		// 进行取款操作
		case 3:
			System.out.println("-----------------取款业务---------------");
			oa.outputMoney();
			try {
				th.sleep(5000);
				mainmenu();
			} catch (Exception e) {
			}
			break;
		// 进行查询操作
		case 4:
			System.out.println("-----------------查询业务---------------");
			oa.search();
			try {
				th.sleep(4000);

				mainmenu();
			} catch (Exception e) {
			}
			break;
		// 进行冻结操作
		case 5:
			System.out.println("----------------冻结业务---------------");
			oa.frostAccount();
			try {
				th.sleep(4000);

				mainmenu();
			} catch (Exception e) {
			}
			break;
		// 进行解冻操作
		case 6:
			System.out.println("----------------解冻业务---------------");
			oa.iceoutAccount();
			try {
				th.sleep(4000);

				mainmenu();
			} catch (Exception e) {
			}
			break;
		// 进行挂失操作
		case 7:
			System.out.println("----------------挂失业务---------------");
			oa.lostReportAccount();
			try {
				th.sleep(4000);

				mainmenu();
			} catch (Exception e) {
			}
			break;
		// 进行解除挂失的操作
		case 8:
			System.out.println("----------------解挂业务---------------");
			oa.outlostAccount();
			try {
				th.sleep(4000);

				mainmenu();
			} catch (Exception e) {
			}
			break;
		// 进行转账的操作
		case 9:
			System.out.println("---------------转账业务---------------");
			oa.devolveMoney();
			try {
				th.sleep(4000);

				mainmenu();
			} catch (Exception e) {
			}
			break;
		// 进行帐户的注销操作
		case 10:
			System.out.println("---------------销户业务-------------");
			oa.logoutAccount();
			try {
				th.sleep(4000);

				mainmenu();
			} catch (Exception e) {
			}
			break;
		// 如果输入的值不再范围之内，提出警告，跳到主界面重新操作
		default:
			System.out.println("------------输入序列编号错误------------");
			System.out.println("------------2秒后跳转到主界面-----------");
			try {
				th.sleep(2000);
				mainmenu();
			} catch (Exception e) {
			}
		}

	}

	/**
	 *<br>
	 * 方法说明：接受开户信息，并将开户的信息封装到Account对象中 <br>
	 * 输入参数： <br>
	 * 返回类型：Account类型
	 */
	public Account createAccountInput() {
		Console cos;
		// 实例化一个控制台
		cos = System.console();
		System.out.print("请输入户主姓名:");
		// 存储用户的姓名
		String name = cos.readLine();	
		String password=null;
		for (int n = 1; n > 0; n++) {
			// 输入校验: 密码必须是数字		
			cos = System.console();
			System.out.print("请输入储户密码:");
			char[] pass = cos.readPassword();
			boolean valid = true;
			for (int i = 0; i < pass.length; i++) {
				if (!Character.isDigit(pass[i])) {
					valid = false;
					break;
				}
			}
			if (valid) {
				password = new String(pass);
				break;
			} else {
				
				System.out.println("----密码必须是数字请重新输入---");
				
			}
		}
		// System.out.print("请输入储户密码:");
		// 存储用户的密码
		// String password = new String(cos.readPassword());
		//System.out.print("请输入存储金额:");
		// 存储用户的金额
		BigDecimal money=null;
		for(int n=1;n>0;n++){
		//输入校验: 金额校验
		System.out.print("请输入存储金额:");
		cos = System.console();
		String s = cos.readLine();
		try{
			 money = new BigDecimal(s);
             break;
		}catch(Exception e){
			 System.out.println("----金额输入有误,请重新输入!----");
		}
            }
		// 存储用户的身份证ID
		String id=null;
		for(int n=1;n>0;n++){
		System.out.print("请输入身份证ID:");
		cos=System.console();
		String re ="\\d{15}|\\d{18}";
		String na = cos.readLine();
		if(na.matches(re)){
		    id=na;
			break;
		}else{
		   System.out.println("----身份证必须为15位或18位,请重输----");
		  }
		}
       // 存储用户的电话
		String tele=null;
		for(int n=1;n>0;n++){
		System.out.print("请输入电话:");
		cos=System.console();
		String re ="\\d{11}|\\d{3}-\\d{8}|\\d{4}-\\d{8}|\\d{4}-\\d{7}";
		String na = cos.readLine();
		if(na.matches(re)){
		    tele=na;
			break;
		}else{
		   System.out.println("----请输入正确的固定电话或手机号----");
		  }
		}
		System.out.print("请输入详细地址:");
		// 存储用户的地址信息
		String address = cos.readLine();
		// 利用Random中的方法随即生成一个银行账号no
		Random ma = new Random();
		String no = "002010" + Math.abs(ma.nextInt());
		int state = 1;
		// 存储用户开户的日期
		Date date = new Date();
		SimpleDateFormat sdf =new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
		
		String nowdate = sdf.format(date);
		// 把以上各种信息封装到Account中
		Account account = new Account();
		account.setAccountno(no);
		account.setUsername(name);
		account.setPassword(password);
		account.setBanlace(money);
		account.setIdcard(id);
		account.setTelephone(tele);
		account.setAddress(address);
		account.setState(state);
		account.setDate(nowdate);
		// 返回带数据的实例

		return account;

	}

	/**
	 *<br>
	 * 方法说明：接受用户输入的卡号和密码信息，并将开户的信息封装到Account对象中 <br>
	 * 输入参数： <br>
	 * 返回类型：Account类型
	 */
	public Account isExistInput() {
		// 实例化一个控制台,以便获得各种信息
		Console co;
		String cardno=null;
		for(int n=1;n>0;n++){
		System.out.print("请输入执行的卡号:");
		co=System.console();
		String re ="^[0-9]\\d*|0$";
		String na = co.readLine();
		if(na.matches(re)){
		    cardno=na;
			break;
		}else{
		   System.out.println("卡号必须为全数字");
		  }
		}
		
		// 存储输入的卡号
		
		String pas=null;
		int rt=0;
		for (int n = 1; n > 0; n++) {
			// 输入校验: 密码必须是数字		
			co = System.console();
			System.out.print("请输入储户密码:");
			char[] pass = co.readPassword();
			boolean valid = true;
			for (int i = 0; i < pass.length; i++) {
				if (!Character.isDigit(pass[i])) {
					valid = false;
					break;
				}
			}
			if (valid) {
				pas = new String(pass);
				break;
			} else {
				 rt++;
				 if(rt<3){
				System.out.println("-----密码必须是数字请重新输入-----");
				 }else
				{
				 System.out.println("-----错误已经达到三次,强制退出----");
				 System.exit(0);
				 }
			}
		}
		// 把上面数据封装到Account对象中
		Account ac = new Account();
		ac.setAccountno(cardno);
		ac.setPassword(pas);
		// 返回一个带数据的Account对象ac
		return ac;
	}

	public Account input() {
		// 实例化一个控制台,以便获得各种信息
		//Console co = System.console();
		//System.out.print("请输入执行的卡号:");
		// 存储输入的卡号
		//String na = co.readLine();
         Console co;
		String nano=null;
		for(int n=1;n>0;n++){
		System.out.print("请输入执行的卡号:");
		co=System.console();
		String re ="^[0-9]\\d*|0$";
		String na = co.readLine();
		if(na.matches(re)){
		    nano=na;
			break;
		}else{
		   System.out.println("卡号必须为全数字");
		  }
		}

		Account ac = new Account();
		ac.setAccountno(nano);
		// 返回一个带数据的Account对象ac
		return ac;
	}

}
